/**************************************************************************
 * @file data_pack_handle.h
 * @author BryanHe(贺璧) (532352406@qq.com)
 * @brief 
 * @version 0.1
 * @date 2025-04-07
 * 
 * @copyright Copyright (c) 2025
 * 
 *************************************************************************/
#ifndef USR_DATA_PACK_HANDLE__H_H
#define USR_DATA_PACK_HANDLE__H_H

#ifdef __cplusplus
extern "C"{
#endif
#include <stdint.h>
#include <stdio.h>
#include <string.h>

/**
==数据包结构==
    {[包头0xAA][转义后的数据块][包尾0x55]}
    转义后的数据块 = 转义处理后的(原始数据块)
    原始数据块 = {[数据(N字节)][CRC(2字节)]}
==转义规则==
    0xAA → 0x7E01
    0x55 → 0x7E02
    0x7E → 0x7E03
==CRC计算==
    使用CRC-16/CCITT-FALSE算法，多项式0x1021，初始值0xFFFF
==使用注意事项==
    1. 原始数据块长度不应超过256字节
    2. 打包后的缓冲区需要预留足够空间（最大可能为原始数据长度的2倍 + 2字节）
    3. 解包时需要完整接收数据包后再进行处理
    4. CRC校验失败时会返回-1，需要调用方处理异常情况
    5. 用户有效数据不应超过254字节（256-2，CRC Field Used 2 Bytes）
    可以根据具体需求调整CRC算法或增加错误处理机制。
 */

#define USR_D_PACK_ORIGINAL_PK_MAX 256ul
#define USR_D_PACK_MAX_DAT_PAYLOAD (USR_D_PACK_ORIGINAL_PK_MAX - 2 /*CRC 2Bytes*/)
#define USR_D_PACK_MAX_PACKAGE_LEN (USR_D_PACK_ORIGINAL_PK_MAX * 2 + 2ul)
#define USR_D_PKG_HEAD             0xAA
#define USR_D_PKG_END              0x55
#define USR_D_ESCAPE_ID            0x7E

// CRC计算函数（使用CRC-16/CCITT-FALSE算法，多项式0x1021，初始值0xFFFF）
uint16_t calculate_crc(const uint8_t *dat, uint32_t length);
// 数据打包函数
int pack_data(const uint8_t *dat, uint8_t data_len, uint8_t *packet);
// 数据解包函数
int unpack_data(const uint8_t *packet, uint32_t packet_len, uint8_t *dat, uint8_t *data_len, uint16_t *crc);

#ifdef __cplusplus
}
#endif

#endif //USR_DATA_PACK_HANDLE__H_H


